<!--

  旧版配置。 

  费率配置：

  @author terrfly
  @site https://www.jeequan.com
  @date 2022/04/06 10:14
-->

<!--

   费率配置面板，  支持9种模式： 

  ( mgrIsv ) 运营平台对服务商的配置：  查询【服务商所有支持的支付方式】
  支付产品 、 [配置]服务商底价、  [配置]代理商默认费率、  [配置]商户默认费率。 

  ( mgrAgent ) 运营平台对代理商的费率配置： 查询： 【代理的所属服务商 、 所属上级代理商的所有开通的支付产品】 
  支付产品、 [显示]服务商底价， [显示]上级代理商费率、  [配置]代理商的费率、  [配置]下级代理商的默认费率、  [配置]商户默认费率。 

  ( mgrMch ) 运营平台对商户：  查询【商户的所属服务商 、 所属上级代理商的所有开通的支付产品】
  支付产品、 [显示]服务商底价， [显示]上级代理商费率、  [配置]商户的费率。 

  ( agentSelf ) 代理商 对自己：   查询【当前代理商已经开通的产品】
  支付产品、 [显示]当前代理商的费率、  [配置]下级代理商的默认费率、  [配置]商户默认费率。

  ( agentSubagent ) 代理商对下级代理商：  查询【当前代理商已经开通的产品】
  支付产品、 [显示]当前代理商的费率、  [配置]下级代理商的费率

  ( agentMch ) 代理商对商户： 查询【当前代理商已经开通的产品】
  支付产品、 [显示]上级代理商费率、  [配置]商户的费率。 


  ( mgrApplyment ) 显示方式同： mgrMch。  只是不需要 切换支付接口和保存按钮    新增按钮： 查询默认费率。 

  ( agentApplyment ) 显示方式同： agentMch  只是不需要 切换支付接口和保存按钮.   新增按钮： 查询默认费率。 

  ( mchApplyment ) 不需要 切换支付接口和保存按钮.   显示的就是代理商或者服务商配置的默认费率。 
  -->

<template>
  <div class="drawer">
    <!-- 费率配置 面板   仅选择了支付接口才可见 -->
    <div v-if="vdata.currentIfCode" style="margin-bottom: 15px;">
      <div class="jeepay-m-btn-alipay-box" style="margin: 15px 0;">
        <a-checkbox v-if="props.configMode != 'mchApplyment'" @change="(e) => batchChecked('ALL', e.target.checked)">全选</a-checkbox>
        <a-button v-if="props.configMode == 'mgrApplyment' || props.configMode == 'agentApplyment' " class="jeepay-m-btn jeepay-m-cover" data-type="text" type="primary" @click="resetDefRate"><copy-outlined />读取默认费率</a-button> &nbsp;
        <a-button v-if=" getShowName('mainRateMap') " class="jeepay-m-btn jeepay-m-cover" data-type="text" type="primary" @click="showSetFeeModalFunc('mainRateMap')">批量设置 [{{ getShowName('mainRateMap') }}]</a-button> &nbsp;
        <a-button v-if=" getShowName('agentdefMap') " class="jeepay-m-btn jeepay-m-cover" data-type="text" type="primary" @click="showSetFeeModalFunc('agentdefMap')">批量设置 [{{ getShowName('agentdefMap') }}]</a-button> &nbsp;
        <a-button v-if=" getShowName('mchapplydefMap') " class="jeepay-m-btn jeepay-m-cover" data-type="text" type="primary" @click="showSetFeeModalFunc('mchapplydefMap')">批量设置 [{{ getShowName('mchapplydefMap') }}]</a-button>
      </div>
      <a-card v-show="vdata.allPaywayList.filter( r => (r.wayType == 'WECHAT') ).length > 0">
        <template #title>微信产品</template><br>
        <a-table :dataSource="vdata.allPaywayList.filter( r => (r.wayType == 'WECHAT') )" :columns="vdata.tableColumns" :pagination="false">
          <!-- header 标题 插槽 -->
          <template #headerCell="{ column }">
            <template v-if="column.key === 'batch'">
              <a-checkbox v-if="props.configMode != 'mchApplyment'" @change="(e) => batchChecked('WECHAT', e.target.checked)" />
            </template>
          </template>

          <!-- bodyCell 可以直接复制到下面两个table表格中。 内容完全相同  -->
          <template #bodyCell="{ column, record }">
            <!-- 批量选择的 checkbox -->
            <template v-if="column.key === 'batch'"><a-checkbox v-model:checked="record.checked" /></template>

            <!-- 支付产品名称 -->
            <template v-if="column.key === 'wayName'">{{ record.wayName }}[{{ record.wayCode }}]</template>

            <!-- 是否开通 -->
            <template v-if="column.key === 'state'"><a-switch v-model:checked="vdata.mainRateMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="开通" un-checked-children="关闭" /></template>

            <!-- 进件是否显示 -->
            <template v-if="column.key === 'applymentSupport' && vdata.mainRateMap[record.wayCode].state">
              <a-switch v-model:checked="vdata.mainRateMap[record.wayCode].applymentSupport" :checkedValue="1" :unCheckedValue="0" checked-children="显示" un-checked-children="隐藏" />
            </template>

            <!-- 配置信息  -->
            <template v-if="column.key === 'op' && vdata.mainRateMap[record.wayCode].state">
              <!-- 名称显示（ 例如 商户费率：） -->
              {{ getShowName('mainRateMap') ? getShowName('mainRateMap') + ':' : '' }} 

              <a-popover placement="top">
                <template #content><p>自动读取上级设置的费率值并填充至输入框， 优先级： 默认费率 --> 上级费率</p></template>
                <a-button v-if="isShowsetParentRateBtn()" shape="round" size="small" @click="setParentRateBtnFunc(record.wayCode)"><BulbOutlined />读取</a-button>
              </a-popover>
              <div style="margin-top:3px" />

              <!-- 配置具体信息 -->
              <JeepayPaywayItem v-if="props.configMode != 'agentSelf'" :fixConfig="record.fixConfig" :value="vdata.mainRateMap[record.wayCode]" :readonly="props.configMode == 'mchApplyment' " />

              <!-- 下级代理商默认费率 -->
              <template v-if="getShowName('agentdefMap')">
                <hr>
                {{ getShowName('agentdefMap') }}：<a-switch v-model:checked="vdata.agentdefMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="配置" un-checked-children="无" />
                <JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.agentdefMap[record.wayCode]" :readonly="false" />
              </template>
  
              <!-- 商户进件默认费率 -->
              <template v-if="getShowName('mchapplydefMap') && showMchApplyment(record.wayCode)">
                <hr>
                {{ getShowName('mchapplydefMap') }}： <a-switch v-model:checked="vdata.mchapplydefMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="配置" un-checked-children="无" />
                <JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.mchapplydefMap[record.wayCode]" :readonly="false" />
              </template>
            </template>
  
            <!-- 服务商底价  -->
            <template v-if="column.key === 'readonlyIsvCostRate'"><JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.readonlyIsvCostRateMap[record.wayCode]" :readonly="true" /></template>

            <!-- 上级代理商费率  -->
            <template v-if="column.key === 'readonlyParentAgentRate'"><JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.readonlyParentAgentRateMap[record.wayCode]" :readonly="true" /></template>
          </template>
        </a-table>
      </a-card>
      <a-card v-show="vdata.allPaywayList.filter( r => (r.wayType == 'ALIPAY' ) ).length > 0" style="margin-top: 20px;">
        <template #title>支付宝产品</template><br>
        <a-table :dataSource="vdata.allPaywayList.filter( r => (r.wayType == 'ALIPAY' ) )" :columns="vdata.tableColumns" :pagination="false">
          <!-- header 标题 插槽 -->
          <template #headerCell="{ column }">
            <template v-if="column.key === 'batch'">
              <a-checkbox v-if="props.configMode != 'mchApplyment'" @change="(e) => batchChecked('ALIPAY', e.target.checked)" />
            </template>
          </template>
          
          <template #bodyCell="{ column, record }">
            <!-- 批量选择的 checkbox -->
            <template v-if="column.key === 'batch'"><a-checkbox v-model:checked="record.checked" /></template>

            <!-- 支付产品名称 -->
            <template v-if="column.key === 'wayName'">{{ record.wayName }}[{{ record.wayCode }}]</template>

            <!-- 是否开通 -->
            <template v-if="column.key === 'state'"><a-switch v-model:checked="vdata.mainRateMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="开通" un-checked-children="关闭" /></template>

            <!-- 进件是否显示 -->
            <template v-if="column.key === 'applymentSupport' && vdata.mainRateMap[record.wayCode].state">
              <a-switch v-model:checked="vdata.mainRateMap[record.wayCode].applymentSupport" :checkedValue="1" :unCheckedValue="0" checked-children="显示" un-checked-children="隐藏" />
            </template>

            <!-- 配置信息  -->
            <template v-if="column.key === 'op' && vdata.mainRateMap[record.wayCode].state">
              <!-- 名称显示（ 例如 商户费率：） -->
              {{ getShowName('mainRateMap') ? getShowName('mainRateMap') + ':' : '' }} 

              <a-popover placement="top">
                <template #content><p>自动读取上级设置的费率值并填充至输入框， 优先级： 默认费率 --> 上级费率</p></template>
                <a-button v-if="isShowsetParentRateBtn()" shape="round" size="small" @click="setParentRateBtnFunc(record.wayCode)"><BulbOutlined />读取</a-button>
              </a-popover>
              <div style="margin-top:3px" />

              <!-- 配置具体信息 -->
              <JeepayPaywayItem v-if="props.configMode != 'agentSelf'" :fixConfig="record.fixConfig" :value="vdata.mainRateMap[record.wayCode]" :readonly="props.configMode == 'mchApplyment' " />

              <!-- 下级代理商默认费率 -->
              <template v-if="getShowName('agentdefMap')">
                <hr>
                {{ getShowName('agentdefMap') }}：<a-switch v-model:checked="vdata.agentdefMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="配置" un-checked-children="无" />
                <JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.agentdefMap[record.wayCode]" :readonly="false" />
              </template>
  
              <!-- 商户进件默认费率 -->
              <template v-if="getShowName('mchapplydefMap') && showMchApplyment(record.wayCode)">
                <hr>
                {{ getShowName('mchapplydefMap') }}： <a-switch v-model:checked="vdata.mchapplydefMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="配置" un-checked-children="无" />
                <JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.mchapplydefMap[record.wayCode]" :readonly="false" />
              </template>
            </template>
  
            <!-- 服务商底价  -->
            <template v-if="column.key === 'readonlyIsvCostRate'"><JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.readonlyIsvCostRateMap[record.wayCode]" :readonly="true" /></template>

            <!-- 上级代理商费率  -->
            <template v-if="column.key === 'readonlyParentAgentRate'"><JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.readonlyParentAgentRateMap[record.wayCode]" :readonly="true" /></template>
          </template>
        </a-table>
      </a-card>
      <br>
      <a-card v-show="vdata.allPaywayList.filter( r => (r.wayType != 'WECHAT' && r.wayType != 'ALIPAY')).length > 0">
        <template #title>其他产品</template><br>
        <a-table :dataSource="vdata.allPaywayList.filter( r => (r.wayType != 'WECHAT' && r.wayType != 'ALIPAY'))" :columns="vdata.tableColumns" :pagination="false">
          <!-- header 标题 插槽 -->
          <template #headerCell="{ column }">
            <template v-if="column.key === 'batch'">选择</template>
          </template>
  
          
          <template #bodyCell="{ column, record }">
            <!-- 批量选择的 checkbox -->
            <template v-if="column.key === 'batch'"><a-checkbox v-model:checked="record.checked" /></template>

            <!-- 支付产品名称 -->
            <template v-if="column.key === 'wayName'">{{ record.wayName }}[{{ record.wayCode }}]</template>

            <!-- 是否开通 -->
            <template v-if="column.key === 'state'"><a-switch v-model:checked="vdata.mainRateMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="开通" un-checked-children="关闭" /></template>

            <!-- 进件是否显示 -->
            <template v-if="column.key === 'applymentSupport' && vdata.mainRateMap[record.wayCode].state">
              <a-switch v-model:checked="vdata.mainRateMap[record.wayCode].applymentSupport" :checkedValue="1" :unCheckedValue="0" checked-children="显示" un-checked-children="隐藏" />
            </template>

            <!-- 配置信息  -->
            <template v-if="column.key === 'op' && vdata.mainRateMap[record.wayCode].state">
              <!-- 名称显示（ 例如 商户费率：） -->
              {{ getShowName('mainRateMap') ? getShowName('mainRateMap') + ':' : '' }} 

              <a-popover placement="top">
                <template #content><p>自动读取上级设置的费率值并填充至输入框， 优先级： 默认费率 --> 上级费率</p></template>
                <a-button v-if="isShowsetParentRateBtn()" shape="round" size="small" @click="setParentRateBtnFunc(record.wayCode)"><BulbOutlined />读取</a-button>
              </a-popover>
              <div style="margin-top:3px" />
              
              <!-- 配置具体信息 -->
              <JeepayPaywayItem v-if="props.configMode != 'agentSelf'" :fixConfig="record.fixConfig" :value="vdata.mainRateMap[record.wayCode]" :readonly="props.configMode == 'mchApplyment' " />

              <!-- 下级代理商默认费率 -->
              <template v-if="getShowName('agentdefMap')">
                <hr>
                {{ getShowName('agentdefMap') }}：<a-switch v-model:checked="vdata.agentdefMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="配置" un-checked-children="无" />
                <JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.agentdefMap[record.wayCode]" :readonly="false" />
              </template>
  
              <!-- 商户进件默认费率 -->
              <template v-if="getShowName('mchapplydefMap') && showMchApplyment(record.wayCode)">
                <hr>
                {{ getShowName('mchapplydefMap') }}： <a-switch v-model:checked="vdata.mchapplydefMap[record.wayCode].state" :checkedValue="1" :unCheckedValue="0" checked-children="配置" un-checked-children="无" />
                <JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.mchapplydefMap[record.wayCode]" :readonly="false" />
              </template>
            </template>
  
            <!-- 服务商底价  -->
            <template v-if="column.key === 'readonlyIsvCostRate'"><JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.readonlyIsvCostRateMap[record.wayCode]" :readonly="true" /></template>

            <!-- 上级代理商费率  -->
            <template v-if="column.key === 'readonlyParentAgentRate'"><JeepayPaywayItem :fixConfig="record.fixConfig" :value="vdata.readonlyParentAgentRateMap[record.wayCode]" :readonly="true" /></template>
          </template>
        </a-table>
      </a-card>
  
      <a-modal v-model:visible="vdata.showSetFeeModal" title="设置费率" @ok="handleOkFunc">
        <a-form>
          <a-form-item v-if="props.mode != 'mchApplyment'" label="统一设置费率值：">
            <a-input-number v-model:value="vdata.showSetFeeModalValue" /> %
          </a-form-item>
  
          <a-form-item label="统一设置是否开通：">
            <a-radio-group v-model:value="vdata.showSetIsOpenValue">
              <a-radio :value="true">开通</a-radio><a-radio :value="false">关闭</a-radio>
            </a-radio-group>
          </a-form-item>
        </a-form>
      </a-modal>
    </div>
  
    <!-- 只有运营平台配置的商户， 才可以配置 商户0费率  -->
    <a-collapse v-if="props.configMode == 'mgrMch'">
      <a-collapse-panel key="a1" header="【保存】高级配置项">
        <a-checkbox v-model:checked="vdata.noCheckRuleFlag">本商户为特殊商户， 不校验上下级的费率比较规则， 允许低于服务商的底价。 </a-checkbox>
      </a-collapse-panel>
    </a-collapse>
  
    <!-- 只有运营平台配置的 服务商， 才可以 忽略项目  -->
    <a-collapse v-if="props.configMode == 'mgrIsv'">
      <a-collapse-panel key="a2" header="【保存】高级配置项">
        <a-checkbox v-model:checked="vdata.noCheckRuleFlag">不校验服务商的费率配置信息 （仅特殊情况才可使用）。 </a-checkbox>
      </a-collapse-panel>
    </a-collapse>
  
    <div v-if="!props.onlyRate && showSaveBtn" class="drawer-btn-center">
      <a-button type="primary" @click="onSubmit"><check-outlined />保存</a-button>
    </div>
  </div>
</template>
  
<script lang="ts" setup >
import { $getRateConfigPayways, $getRateConfigSavedMapData, $saveRateConfig } from '@/api/manage'
import { reactive, getCurrentInstance, onMounted, defineExpose } from 'vue'

// 导入全局函数
const { $infoBox, $hasAgentEnt } = getCurrentInstance()!.appContext.config.globalProperties

// 定义父组件的传值
const props : any = defineProps({

  infoId: { type: String, default: '' }, // 当前配置的所属infoId
  configMode: { type: String, default: '' },   // 模式
  selectIfCode: { type: String ,default: '' }, // 默认选中的支付接口
  onlyRate: { type: Boolean ,default: false }, // 是否只有费率的模式， true: 只显示费率（一般进件模式选择该方式, 并且配合selectIfCode使用），  false 显示支付接口和保存按钮。 
  showSaveBtn: { type: Boolean ,default: true }, // 是否显示保存按钮， 当向三方申请保存费率申请时，不需要显示。 

})


function getShowName(mapName){

  // 运营平台： 服务商的配置费率模式
  if(props.configMode == 'mgrIsv'){
      if(mapName == 'mainRateMap') return '服务商底价'
      if(mapName == 'agentdefMap' && $hasAgentEnt() ) return '代理商默认费率'
      if(mapName == 'mchapplydefMap') return '商户进件默认费率'
  }

  if(props.configMode == 'mgrAgent'){
      if(mapName == 'mainRateMap') return '当前代理商费率'
      if(mapName == 'agentdefMap' && $hasAgentEnt() ) return '下级代理商默认费率'
      if(mapName == 'mchapplydefMap' && $hasAgentEnt() ) return '代理商所属商户进件默认费率'
  }

    if(props.configMode == 'agentSelf'){
      if(mapName == 'mainRateMap') return ''
      if(mapName == 'agentdefMap' && $hasAgentEnt() ) return '下级代理商默认费率'
      if(mapName == 'mchapplydefMap') return '商户进件默认费率'
  }

  if(props.configMode == 'agentSubagent'){
      if(mapName == 'mainRateMap') return '代理费率'
  }

  if(props.configMode == 'mgrMch' || props.configMode == 'agentMch' ){
      if(mapName == 'mainRateMap') return '商户费率'
  }

  if(props.configMode == 'mgrApplyment' || props.configMode == 'agentApplyment'){
      if(mapName == 'mainRateMap') return '进件费率'
  }

  if(props.configMode == 'mchSelfApp1'){
    if(mapName == 'mainRateMap') return '接口费率'
  }

  return ''
}

// 判断是否显示商户的进件费率的配置
function showMchApplyment(wayCode){

  // 运营平台： 服务商的配置费率模式 : 判断是否主动开启
  if(props.configMode == 'mgrIsv'){
      return vdata.mainRateMap[wayCode].applymentSupport == 1
  }

  // 其他的需要判断： 是否服务商支持进件。  判断wayCodes中是否支持。
  let obj = vdata.allPaywayMap[wayCode]
  return obj && obj.fixConfig && obj.fixConfig.applymentSupport == 1

}

// 定义响应式数据
const vdata : any = reactive({
      currentIfCode : '', //当前选择的支付通道
      btnLoading: false, // 按钮loading 
      jeepayPaywayFeeFlag: false, // 是否显示费率组件（用于重新渲染组件）

      // 费率设置面板的 table 列
      tableColumns : [],


      showSetFeeModal: false, //显示统一设置 弹层
      showSetFeeModalMode: '', //设置类型
      showSetFeeModalValue: 0, //设置的费率
      showSetIsOpenValue: true, //设置统一的开关
      
      allPaywayList : [], //费率设置的集合 
      allPaywayMap : {}, // 费率设置的集合 Map

      //  key  = ifCode 
      // mainRateMap 表示多个费率值的设置：   ISVCOST,  AGENT,  MCH,  根据传入的不同进行不同结果的返回。 
      mainRateMap: {},

      agentdefMap: {}, // 代理商默认费率
      mchapplydefMap: {}, // 商户进件默认费率

      readonlyIsvCostRateMap: {}, // 服务商底价（用于显示）
      readonlyParentAgentRateMap: {}, // 上级代理商费率（用于显示）
      readonlyParentDefRateRateMap: {}, // 商户的上级的默认费率（用于读取并赋值到input）

      noCheckRuleFlag: false, // 特殊商户， 不进行验证费率规则


})


// 挂载钩子函数 
onMounted(() => {
  
  vdata.currentIfCode = '' // 默认不选中

  vdata.currentIfCode = props.selectIfCode // 默认接口

  // 重置表格
  resetTableColumns()

  // 重新渲染配置面板
  if(vdata.currentIfCode){
    reloadRatePanel() 
  }

})

/* 根据不同的类型 显示不同的列表数据  */
function resetTableColumns(){

  // 运营平台配置： 代理商费率， 配置 商户费率， 配置进件信息
  if(props.configMode == 'mgrAgent' || props.configMode == 'mgrMch' || props.configMode == 'mgrApplyment'){
      vdata.tableColumns = [
            {key: 'batch', title: '批量选择', width: '50px' },
            {key: 'wayName', title: '支付产品', width: '110px'  },
            {key: 'readonlyIsvCostRate', title: '服务商底价'  },
            {key: 'readonlyParentAgentRate', title: '上级代理商费率' },
            {key: 'state', title: '是否开通'  },
            {key: 'op', title: '配置信息'},
          ]

      if(!$hasAgentEnt()){
        vdata.tableColumns.splice(3, 1) //删除 上级代理商费率 列
      }


  // 代理商配置商户的费率
  }else if(props.configMode == 'agentMch' || props.configMode == 'agentSubagent' || props.configMode == 'agentApplyment'){
      vdata.tableColumns = [
            {key: 'batch', title: '批量选择', width: '50px' },
            {key: 'wayName', title: '支付产品', width: '110px'  },
            {key: 'readonlyParentAgentRate', title: '我的代理费率' },
            {key: 'state', title: '是否开通'},
            {key: 'op', title: '配置信息' },
          ]

  }
  // 代理商配置自己的配置信息
  else if(props.configMode == 'agentSelf'){
      vdata.tableColumns = [
            {key: 'batch', title: '批量选择', width: '50px' },
            {key: 'wayName', title: '支付产品', width: '110px'  },
            {key: 'readonlyParentAgentRate', title: '我的代理费率'  },
            {key: 'op', title: '配置信息' },
          ]

  }
  // 服务商底价设置
  else if(props.configMode == 'mgrIsv'){
      vdata.tableColumns = [
            {key: 'batch', title: '批量选择', width: '50px' },
            {key: 'wayName', title: '支付产品', width: '110px'  },
            {key: 'state', title: '是否开通'  },
            {key: 'applymentSupport', title: '进件显示' },
            {key: 'op', title: '配置信息' },
          ]

  }
    // 商户自主进件
  else if(props.configMode == 'mchApplyment'){
      vdata.tableColumns = [
            {key: 'wayName', title: '支付产品', width: '270px'  },
            {key: 'op', title: '费率' },
          ]

  }
  else{ // 默认使用该方式显示


  vdata.tableColumns = [
            {key: 'batch', title: '批量选择', width: '70px' },
            {key: 'wayName', title: '支付产品', width: '270px'  },
            {key: 'state', title: '是否开通', width: '120px'  },
            {key: 'op', title: '配置信息' },
          ]


  }

}


// 重置 【费率配置】面板
async function reloadRatePanel(){

  // 数据的重置
  vdata.allPaywayList = [] 
  vdata.allPaywayMap = {}

  vdata.mainRateMap= {}
  vdata.agentdefMap= {}
  vdata.mchapplydefMap= {}
  vdata.readonlyIsvCostRateMap = {}
  vdata.readonlyParentAgentRateMap = {}
  vdata.readonlyParentDefRateRateMap = {}

  // 当前保存的数据 (DB中的)
  let savedMap : any = {}

  //查询当前已经配置的费率 
  await $getRateConfigSavedMapData(props.infoId, props.configMode, vdata.currentIfCode).then((savedMapRes) => {
    savedMap = savedMapRes
  })

  // 查询全部支付产品列表 
  await $getRateConfigPayways(props.infoId, props.configMode, vdata.currentIfCode).then((res) => {

      res.records.forEach(item => {

          item.checked = false // 批量选择， 默认不选中
          vdata.allPaywayList.push(item)
          vdata.allPaywayMap[item.wayCode] = item
          
          // 初始化数据 
          vdata.mainRateMap[item.wayCode] = {
              wayCode: item.wayCode,
              state: 0, // 默认不开通
              applymentSupport: 0, // 进件是否显示
              feeType: 'SINGLE', // 默认单笔费率
              levelList: [], // 阶梯费率数组 
          }

          vdata.agentdefMap[item.wayCode] = {
              wayCode: item.wayCode,
              state: 0, // 默认不开通
              applymentSupport: 0, // 进件是否显示
              feeType: 'SINGLE', // 默认单笔费率
              levelList: [], // 阶梯费率数组 
          }

          vdata.mchapplydefMap[item.wayCode] = {
              wayCode: item.wayCode,
              state: 0, // 默认不开通
              applymentSupport: 0, // 进件是否显示
              feeType: 'SINGLE', // 默认单笔费率
              levelList: [], // 阶梯费率数组 
          }


          vdata.readonlyIsvCostRateMap[item.wayCode] = {
              wayCode: item.wayCode,
              state: 0, // 默认不开通
              applymentSupport: 0, // 进件是否显示
              feeType: 'SINGLE', // 默认单笔费率
              levelList: [], // 阶梯费率数组 
          }


          vdata.readonlyParentAgentRateMap[item.wayCode] = {
              wayCode: item.wayCode,
              state: 0, // 默认不开通
              applymentSupport: 0, // 进件是否显示
              feeType: 'SINGLE', // 默认单笔费率
              levelList: [], // 阶梯费率数组 
          }

          vdata.readonlyParentDefRateRateMap[item.wayCode] = {
              wayCode: item.wayCode,
              state: 0, // 默认不开通
              applymentSupport: 0, // 进件是否显示
              feeType: 'SINGLE', // 默认单笔费率
              levelList: [], // 阶梯费率数组 
          }
          
      })

      // 服务商底价
      if(savedMap && savedMap.ISVCOST){
        changeList('mainRateMap', savedMap.ISVCOST)
      }

      // 代理商费率
      if(savedMap && savedMap.AGENTRATE){
        changeList('mainRateMap', savedMap.AGENTRATE)
      }

      // 商户费率 （此上三个 后台返回接口  三选一 ）
      if(savedMap && savedMap.MCHRATE){
        changeList('mainRateMap', savedMap.MCHRATE)
      }


      // 代理商默认费率
      if(savedMap && savedMap.AGENTDEF){
        changeList('agentdefMap', savedMap.AGENTDEF)
      }

      // 商户默认费率
      if(savedMap && savedMap.MCHAPPLYDEF){
        changeList('mchapplydefMap', savedMap.MCHAPPLYDEF)
      }


      // 服务商底价（用于显示）
      if(savedMap && savedMap.READONLYISVCOST){
        changeList('readonlyIsvCostRateMap', savedMap.READONLYISVCOST)
      }


      // 上级代理商费率（用于显示）
      if(savedMap && savedMap.READONLYPARENTAGENT){
        changeList('readonlyParentAgentRateMap', savedMap.READONLYPARENTAGENT)
      }

      // 上级配置的默认费率（用于显示）
      if(savedMap && savedMap.READONLYPARENTDEFRATE){
        changeList('readonlyParentDefRateRateMap', savedMap.READONLYPARENTDEFRATE)
      }

      
  })

}


// 保存按钮 
function onSubmit(){

  let reqPaywayFeeList = getReqPaywayFeeList()
  if(!reqPaywayFeeList){ // 报错
      return false 
  }

  // 请求对象
  let reqObject = {infoId: props.infoId, ifCode: vdata.currentIfCode, configMode: props.configMode, noCheckRuleFlag: vdata.noCheckRuleFlag ? 1: 0 }
  Object.assign(reqObject, reqPaywayFeeList) // 合并对象

  $saveRateConfig(reqObject).then((res) => {
    $infoBox.message.success('保存成功')
  })
}


function batchChecked(wayType, checked){
  vdata.allPaywayList.filter( r => ((wayType == 'ALL' || r.wayType == wayType) ) ).forEach(element => {
    element.checked = checked
  })
}


// 点击 批量设置弹层的确认按钮 
function handleOkFunc(){

vdata.allPaywayList.filter( r => r.checked).forEach(element => {

      let iele = vdata[vdata.showSetFeeModalMode][element.wayCode]
      iele.feeType = 'SINGLE'
      iele.feeRate = vdata.showSetFeeModalValue
      iele.state = vdata.showSetIsOpenValue ? 1 : 0 // 是否开启
  })

  // 关闭弹层
  vdata.showSetFeeModal = false 

}


// 显示弹层( mode = 修改的mode )
function showSetFeeModalFunc(mode){

if(vdata.allPaywayList.filter(r => r.checked).length <= 0){
  return $infoBox.message.error('请选择需要操作的行')
}

  vdata.showSetFeeModalMode = mode
  vdata.showSetFeeModalValue = 0
  vdata.showSetIsOpenValue = true
  vdata.showSetFeeModal = true
}


// 读取默认费率
function resetDefRate(){

let vals : any = Object.values(vdata.mainRateMap)

  vals.forEach(element => {

        element.state = 0
        element.feeType = 'SINGLE'
        delete element.feeRate
        element.levelList = []

        let copyObject = vdata.readonlyParentDefRateRateMap[element.wayCode]
        if(copyObject){
            Object.assign(element, JSON.parse(JSON.stringify(copyObject)))
        }
        
  })

}


// 更改当前可视化的值 （此时已经查询到了全部支付方式了）
// savedMap : 当前DB保存的数据
function changeList(mode, savedMap){

  // 全部支付方式
  let valList : any = Object.values(vdata[mode])

  valList.forEach(element => {

    // 数据初始化操作
    element.feeType = 'SINGLE'
    delete element.feeRate
    delete element.minFee
    delete element.maxFee
    element.levelList = []

    let record = savedMap[element.wayCode] || {}

    //复制到数组中 
    Object.assign(element, record)
    element.checked = false

    element.state = savedMap[element.wayCode] ? 1 : 0 //默认开通

    // 明确关闭
    if(savedMap[element.wayCode] && savedMap[element.wayCode].state === 0){
        element.state = 0
    }
    
    // 转换费率和金额格式

    if(typeof(element.feeRate) == 'number'){
        element.feeRate = Number.parseFloat((element.feeRate * 100).toFixed(4))
    }

    if(typeof(element.maxFee) == 'number'){
        element.maxFee = Number.parseFloat((element.maxFee / 100).toFixed(2))
    }

    if(typeof(element.minFee) == 'number'){
        element.minFee = Number.parseFloat((element.minFee / 100).toFixed(2))
    }

    if(element.levelList){
        element.levelList.forEach(levelItem => {
            if(typeof(levelItem.feeRate) == 'number'){
                levelItem.feeRate = Number.parseFloat((levelItem.feeRate * 100).toFixed(4))
            }

            if(typeof(levelItem.maxFee) == 'number'){
                levelItem.maxFee = Number.parseFloat((levelItem.maxFee / 100).toFixed(2))
            }

            if(typeof(levelItem.minFee) == 'number'){
                levelItem.minFee = Number.parseFloat((levelItem.minFee / 100).toFixed(2))
            }
        })
    }

    // 贷记卡的金额回显
    if(element.creditCardPaywayFee){
      
      if(typeof(element.creditCardPaywayFee.feeRate) == 'number'){
          element.creditCardPaywayFee.feeRate = Number.parseFloat((element.creditCardPaywayFee.feeRate * 100).toFixed(4))
      }

      if(typeof(element.creditCardPaywayFee.maxFee) == 'number'){
          element.creditCardPaywayFee.maxFee = Number.parseFloat((element.creditCardPaywayFee.maxFee / 100).toFixed(2))
      }

      if(typeof(element.creditCardPaywayFee.minFee) == 'number'){
          element.creditCardPaywayFee.minFee = Number.parseFloat((element.creditCardPaywayFee.minFee / 100).toFixed(2))
      }

      if(element.creditCardPaywayFee.levelList){
          element.creditCardPaywayFee.levelList.forEach(levelItem => {
              if(typeof(levelItem.feeRate) == 'number'){
                  levelItem.feeRate = Number.parseFloat((levelItem.feeRate * 100).toFixed(4))
              }

              if(typeof(levelItem.maxFee) == 'number'){
                  levelItem.maxFee = Number.parseFloat((levelItem.maxFee / 100).toFixed(2))
              }

              if(typeof(levelItem.minFee) == 'number'){
                  levelItem.minFee = Number.parseFloat((levelItem.minFee / 100).toFixed(2))
              }
          })
      }
    }

      
  })
}

// 获取请求数据的对象格式 (包含了验证规则)
// 返回格式： { ISVCOST: []   AGENTDEF:[]   MCHAPPLYDEF:[] }
function getReqPaywayFeeList(){

  let mainRateList = getReqPaywayFeeListByList(Object.values(vdata.mainRateMap))

  if(typeof(mainRateList) != 'object'){
      return false
  }

  let agentdefList = getReqPaywayFeeListByList(Object.values(vdata.agentdefMap))
  if(typeof(agentdefList) != 'object'){
      return false
  }

  let mchapplydefList = getReqPaywayFeeListByList(Object.values(vdata.mchapplydefMap), true)
  if(typeof(mchapplydefList) != 'object'){
      return false
  }

  if(props.configMode == 'mgrIsv'){
      return { ISVCOST: mainRateList, AGENTDEF: agentdefList, MCHAPPLYDEF: mchapplydefList  }

  }else if(props.configMode == 'mgrAgent'){
      return { AGENTRATE: mainRateList, AGENTDEF: agentdefList, MCHAPPLYDEF: mchapplydefList  }

  }else if(props.configMode == 'mgrMch' || props.configMode == 'agentMch' || props.configMode == 'mgrApplyment' || props.configMode == 'mchApplyment' || props.configMode == 'agentApplyment' ){
      return { MCHRATE: mainRateList }
      
  }else if(props.configMode == 'agentSubagent'){
      return { AGENTRATE: mainRateList }
      
  }else if(props.configMode == 'agentSelf'){
      return { AGENTDEF: agentdefList, MCHAPPLYDEF: mchapplydefList  }

  }else if(props.configMode == 'mchSelfApp1'){ // 普通商户的设置
      return { MCHRATE: mainRateList }
  }


}

// element(原始数据) -->  obj（新对象的数据）
// 当前一切正常，返回 true
function levelFeeElementConvertObj(obj, element){

    if(typeof(element.minFee) != 'number'){
      return $infoBox.message.error('阶梯费率请填入保底费用')
    }
    if(typeof(element.maxFee) != 'number'){
      return $infoBox.message.error('阶梯费率请填入封顶费用')
    }

    obj.minFee = Number.parseInt(element.minFee * 100 + '')
    obj.maxFee = Number.parseInt(element.maxFee * 100 + '')


    let levelList :any = []
    for (let y = 0; y < element.levelList.length; y++) {
        let levelItem =  element.levelList[y]

        let levelCopy :any = {}

        if(typeof(levelItem.feeRate) != 'number' || levelItem.feeRate <= 0){
            return $infoBox.message.error('请录入阶梯费率')
        }

        if(typeof(levelItem.minFee) != 'number'){
            return $infoBox.message.error('阶梯费率请填入金额区间值')
        }
        if(typeof(levelItem.maxFee) != 'number'){
            return $infoBox.message.error('阶梯费率请填入金额区间值')
        }

        levelCopy.feeRate = Number.parseFloat((levelItem.feeRate / 100).toFixed(4))
        levelCopy.minFee = Number.parseInt(levelItem.minFee * 100 + '')
        levelCopy.maxFee = Number.parseInt(levelItem.maxFee * 100 + '')
        levelList.push(levelCopy)
    }

    obj.levelList = levelList
    if(obj.levelList.length <= 0 ){
        return $infoBox.message.error('阶梯费率请至少包含一个价格区间')
    }

    return true
}


// 通用获取费率配置信息
function getReqPaywayFeeListByList(list, filterApplymentSupport = false){

  let result : any = []

  // 所有开通 
  // 1. 添加 : vdata.allPaywayMap[r.wayCode]  仅判断仅获取支持的接口（避免 服务商设置了， 又关闭掉了这种情况。    2. 此逻辑可删除， 因为初始化mainRateList是来自支持的接口的。  )
  let supportArray = list.filter(r => (r.state == 1) )

  for (let index = 0; index < supportArray.length; index++) {

      const element = supportArray[index]

        // 只包含进件的数据 && 当前数据行不支持进件
      if(filterApplymentSupport && !showMchApplyment(element.wayCode)){
        continue
      }

      let obj : any = {}

      obj.wayCode = element.wayCode
      obj.feeType = element.feeType
      obj.state = element.state
      obj.applymentSupport = element.applymentSupport

      // 以下为： state = true的情况
  
      //单笔费率值
      if(element.feeType == 'SINGLE'){
        if( typeof(element.feeRate) != 'number' || element.feeRate < 0){
            return $infoBox.message.error('费率值不可小于0')
        }
        obj.feeRate = Number.parseFloat((element.feeRate / 100).toFixed(4))
    
      }else{ // 阶梯费率
            
            let convertResult = levelFeeElementConvertObj(obj, element)
            if(! (convertResult === true)){ // 出现异常
              return false
            }

            // 包含 信用卡的配置项
            if(element.creditCardPaywayFee){
              let creditCardPaywayFeeObj = {}
              let convertResult2 = levelFeeElementConvertObj(creditCardPaywayFeeObj, element.creditCardPaywayFee)
              if(! (convertResult2 === true) ){ // 出现异常
                return false
              }

              obj.creditCardPaywayFee = creditCardPaywayFeeObj
            }

      }

      result.push(obj)
      
  }

  return result

}


/** 获取到： 商户的费率值 （一般用作进件时的设置费率值）  */
/** 还有， 盛付通，申请费率调整时需要  */
function getReqMchRatePaywayFeeList(){

  let reqPaywayFeeList = getReqPaywayFeeList()

  if(!reqPaywayFeeList){ // 报错
      return false 
  }

  return reqPaywayFeeList['MCHRATE']
}


// 判断是否开通了某个支付产品 
function hasApplymentWaycode(wayCode){
  return ( vdata.mainRateMap[wayCode] && vdata.mainRateMap[wayCode].state == 1 ) 
}


// 读取默认费率
function setParentRateBtnFunc(wayCode){

  // 判断上级的费率是否可用
  let checkFunc = (rate) => {

    if(!rate){
      return null
    }

    // 单笔
    if(rate.feeType == 'SINGLE' && typeof(rate.feeRate) != 'undefined'){
      return rate
    }

    // 阶梯
    if(rate.feeType == 'LEVEL' && rate.levelList && rate.levelList.length > 0 && rate.levelList[0].feeRate ){
      return rate
    }

    return null
  }

  let rate = checkFunc(vdata.readonlyParentDefRateRateMap[wayCode]) ||  checkFunc(vdata.readonlyParentAgentRateMap[wayCode]) ||  checkFunc(vdata.readonlyIsvCostRateMap[wayCode])

  if(rate){

    // 只取到基础费率数据
    Object.assign(vdata.mainRateMap[wayCode], JSON.parse(JSON.stringify({
      feeType: rate.feeType,
      feeRate: rate.feeRate,
      levelList: rate.levelList,
      maxFee: rate.maxFee,
      minFee: rate.minFee,
      creditCardPaywayFee: rate.creditCardPaywayFee,
    })))

    return false
  }
}

function isShowsetParentRateBtn(){

   // 设置服务商底价 , 代理商自己的页面, 普通商户 , 商户的进件页面 不需要显示
  if(props.configMode == 'mgrIsv' || props.configMode == 'agentSelf' || props.configMode == 'mchSelfApp1' || props.configMode == 'mchApplyment'){
    return false
  }

  return true
}


defineExpose({getReqMchRatePaywayFeeList, hasApplymentWaycode})


</script>

<style lang="less" scoped>
.drawer {
  /* position: relative; */
  border-radius: 10px;
  background: #fff;
  border-radius: 10px;
  padding: 30px;
  padding-bottom: 0;
}
</style>
